# Python3.7+
import socket

HOST, PORT = '', 8989  # 初始化了HOST地址和端口，如果不指明地址的话默认本地地址127.0.0.1

# 表示使用 IPv4 地址族（还有 AF_INET6 用于 IPv6
# 表示使用 TCP 协议（面向连接的流式传输），而不是 UDP（SOCK_DGRAM）。
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# setsockopt 是设置 socket 选项的方法。
# socket.SOL_SOCKET 表示选项作用于 socket 层。
# socket.SO_REUSEADDR 是一个选项，允许 socket 重用本地地址。
# 1 表示启用这个选项（0 表示禁用）。
# 作用：如果程序崩溃或关闭后立即重启，默认情况下操作系统会保留端口一段时间（处于 TIME_WAIT 状态）。启用 SO_REUSEADDR 可以避免“地址已被使用”的错误，让端口立即可用。

listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))

# listen 方法让 socket 开始监听传入的连接请求。
# 参数 1 表示允许的未接受连接的最大队列长度（ backlog）。这里设为 1，意味着只允许一个连接在队列中等待处理。
# 作用：将 socket 置于服务器模式，准备接受客户端的连接。

listen_socket.listen(1)
print(f'Serving HTTP on port {PORT} ...')
while True:
    client_connection, client_address = listen_socket.accept()
    request_data = client_connection.recv(1024)
    print(request_data.decode('utf-8'))

    http_response = b"""\
HTTP/1.1 200 OK

Hello, World!
"""
    client_connection.sendall(http_response)
    client_connection.close()
